package tantan.mokuai4.homework;

import java.io.*;


public class CopyFile implements Runnable{
//    合成复用原则
    private File f1;
    private File f2;
    CopyFile(File f1,File f2){
        this.f1 = f1;
        this.f2 = f2;
    }

    @Override
    public void run() {
        System.out.println("线程" + Thread.currentThread().getId() + "已启动，源文件为" +
                this.f1 + "目标文件为" + this.f2);
        copyFileAndDirectory(this.f1,this.f2);
    }

//    自定义方法递归地复制文件到目标目录之中
    public void copyFileAndDirectory(File f1,File f2){
//        判断文件是否存在
        if(f1.exists()){
//        调用成员方法先将文件拷贝过去
            copyFiles(f1,f2);
//            判断文件是否是目录，如果是目录则进行递归处理
            if(f1.isDirectory()){
                File[] filearr =  f1.listFiles();
                for(File file : filearr){
                    copyFileAndDirectory(file,new File(f2.getPath() + "/" + f1.getName()));
                }
            }
        }else{
            System.out.println("文件不存在");
        }
    }

//    自定义成员方法复制文件到目标文件
    public void copyFiles(File f1,File f2){
        File newFile = new File(f2.getParent() + "/" + f1.getName());
//        判断传入的源文件是目录还是文件
        if(f1.isDirectory()){
//            如果是目录，则在目标目录下创建一个相同的目录
            newFile.mkdir();
        }else if(f1.isFile()){
//            如果是文件，则进行文件的拷贝
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
            try {
                bos = new BufferedOutputStream(new FileOutputStream(f2));
                bis = new BufferedInputStream(new FileInputStream(f1));
                int res = 0;
                byte[] bArr = new byte[1024];
                while((res = bis.read(bArr)) != -1){
                      bos.write(bArr,0,res);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(null != bos) {
                    try {
                        bos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(null != bis) {
                    try {
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }else{
            System.out.println("拷贝文件失败");
        }
    }
}
